/*
 * 
 */

#ifndef __HI_UNF_CIPHER_H__
#define __HI_UNF_CIPHER_H__

#include "hi_types.h"
#include "comm_cipher.h"

#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif

#define HI_UNF_CIPHER_WORK_MODE_ECB UNF_CIPHER_WORK_MODE_ECB
#define HI_UNF_CIPHER_WORK_MODE_CBC UNF_CIPHER_WORK_MODE_CBC
#define HI_UNF_CIPHER_WORK_MODE_CFB UNF_CIPHER_WORK_MODE_CFB
#define HI_UNF_CIPHER_WORK_MODE_OFB UNF_CIPHER_WORK_MODE_OFB
#define HI_UNF_CIPHER_WORK_MODE_CTR UNF_CIPHER_WORK_MODE_CTR
#define HI_UNF_CIPHER_WORK_MODE_CCM UNF_CIPHER_WORK_MODE_CCM
#define HI_UNF_CIPHER_WORK_MODE_GCM UNF_CIPHER_WORK_MODE_GCM
#define HI_UNF_CIPHER_WORK_MODE_CBC_CTS UNF_CIPHER_WORK_MODE_CBC_CTS
#define HI_UNF_CIPHER_WORK_MODE_BUTT UNF_CIPHER_WORK_MODE_BUTT
typedef UNF_CIPHER_WORK_MODE_E HI_UNF_CIPHER_WORK_MODE_E;
typedef UNF_CIPHER_ALG_E HI_UNF_CIPHER_ALG_E;
typedef UNF_CIPHER_KEY_LENGTH_E HI_UNF_CIPHER_KEY_LENGTH_E;
#define HI_UNF_CIPHER_BIT_WIDTH_INVALID UNF_CIPHER_BIT_WIDTH_INVALID
typedef UNF_CIPHER_BIT_WIDTH_E HI_UNF_CIPHER_BIT_WIDTH_E;
typedef UNF_CIPHER_CTRL_CHANGE_FLAG_S HI_UNF_CIPHER_CTRL_CHANGE_FLAG_S;
#define HI_UNF_CIPHER_KEY_SRC_KLAD_1 UNF_CIPHER_KEY_SRC_KLAD_1
#define HI_UNF_CIPHER_KEY_SRC_KLAD_2 UNF_CIPHER_KEY_SRC_KLAD_2
#define HI_UNF_CIPHER_KEY_SRC_KLAD_3 UNF_CIPHER_KEY_SRC_KLAD_3
#define HI_UNF_CIPHER_KEY_SRC_BUTT UNF_CIPHER_KEY_SRC_BUTT
#define HI_UNF_CIPHER_KEY_SRC_INVALID UNF_CIPHER_KEY_SRC_INVALID
typedef UNF_CIPHER_CA_TYPE_E HI_UNF_CIPHER_CA_TYPE_E;
#define HI_UNF_CIPHER_KLAD_TARGET_RSA UNF_CIPHER_KLAD_TARGET_RSA
#define HI_UNF_CIPHER_KLAD_TARGET_BUTT UNF_CIPHER_KLAD_TARGET_BUTT
typedef UNF_CIPHER_KLAD_TARGET_E HI_UNF_CIPHER_KLAD_TARGET_E;
#define HI_UNF_CIPHER_TYPE_COPY_AVOID UNF_CIPHER_TYPE_COPY_AVOID
#define HI_UNF_CIPHER_TYPE_BUTT UNF_CIPHER_TYPE_BUTT
#define HI_UNF_CIPHER_TYPE_INVALID UNF_CIPHER_TYPE_INVALID
typedef UNF_CIPHER_TYPE_E HI_UNF_CIPHER_TYPE_E;
typedef UNF_CIPHER_ATTS_S HI_UNF_CIPHER_ATTS_S;
#define HI_UNF_CIPHER_SM1_ROUND_08 UNF_CIPHER_SM1_ROUND_08
#define HI_UNF_CIPHER_SM1_ROUND_10 UNF_CIPHER_SM1_ROUND_10
#define HI_UNF_CIPHER_SM1_ROUND_12 UNF_CIPHER_SM1_ROUND_12
#define HI_UNF_CIPHER_SM1_ROUND_14 UNF_CIPHER_SM1_ROUND_14
#define HI_UNF_CIPHER_SM1_ROUND_BUTT UNF_CIPHER_SM1_ROUND_BUTT
typedef UNF_CIPHER_SM1_ROUND_E HI_UNF_CIPHER_SM1_ROUND_E;
typedef UNF_CIPHER_CTRL_S HI_UNF_CIPHER_CTRL_S;
typedef UNF_CIPHER_CTRL_AES_S HI_UNF_CIPHER_CTRL_AES_S;
typedef UNF_CIPHER_CTRL_AES_CCM_GCM_S HI_UNF_CIPHER_CTRL_AES_CCM_GCM_S;
typedef UNF_CIPHER_CTRL_DES_S HI_UNF_CIPHER_CTRL_DES_S;
typedef UNF_CIPHER_CTRL_3DES_S HI_UNF_CIPHER_CTRL_3DES_S;
typedef UNF_CIPHER_CTRL_SM1_S HI_UNF_CIPHER_CTRL_SM1_S;
typedef UNF_CIPHER_CTRL_SM4_S HI_UNF_CIPHER_CTRL_SM4_S;
typedef UNF_CIPHER_CTRL_EX_S HI_UNF_CIPHER_CTRL_EX_S;
typedef UNF_CIPHER_DATA_S HI_UNF_CIPHER_DATA_S;
#define HI_UNF_CIPHER_HASH_TYPE_SHA1 UNF_CIPHER_HASH_TYPE_SHA1
#define HI_UNF_CIPHER_HASH_TYPE_SHA224 UNF_CIPHER_HASH_TYPE_SHA224
#define HI_UNF_CIPHER_HASH_TYPE_SHA256 UNF_CIPHER_HASH_TYPE_SHA256
#define HI_UNF_CIPHER_HASH_TYPE_SHA384 UNF_CIPHER_HASH_TYPE_SHA384
#define HI_UNF_CIPHER_HASH_TYPE_SHA512 UNF_CIPHER_HASH_TYPE_SHA512
#define HI_UNF_CIPHER_HASH_TYPE_HMAC_SHA1 UNF_CIPHER_HASH_TYPE_HMAC_SHA1
#define HI_UNF_CIPHER_HASH_TYPE_HMAC_SHA224 UNF_CIPHER_HASH_TYPE_HMAC_SHA224
#define HI_UNF_CIPHER_HASH_TYPE_HMAC_SHA256 UNF_CIPHER_HASH_TYPE_HMAC_SHA256
#define HI_UNF_CIPHER_HASH_TYPE_HMAC_SHA384 UNF_CIPHER_HASH_TYPE_HMAC_SHA384
#define HI_UNF_CIPHER_HASH_TYPE_HMAC_SHA512 UNF_CIPHER_HASH_TYPE_HMAC_SHA512
#define HI_UNF_CIPHER_HASH_TYPE_SM3 UNF_CIPHER_HASH_TYPE_SM3
#define HI_UNF_CIPHER_HASH_TYPE_BUTT UNF_CIPHER_HASH_TYPE_BUTT
typedef UNF_CIPHER_HASH_TYPE_E HI_UNF_CIPHER_HASH_TYPE_E;
typedef UNF_CIPHER_HASH_ATTS_S HI_UNF_CIPHER_HASH_ATTS_S;
#define HI_UNF_CIPHER_RSA_ENC_SCHEME_NO_PADDING UNF_CIPHER_RSA_ENC_SCHEME_NO_PADDING
#define HI_UNF_CIPHER_RSA_ENC_SCHEME_BLOCK_TYPE_0 UNF_CIPHER_RSA_ENC_SCHEME_BLOCK_TYPE_0
#define HI_UNF_CIPHER_RSA_ENC_SCHEME_BLOCK_TYPE_1 UNF_CIPHER_RSA_ENC_SCHEME_BLOCK_TYPE_1
#define HI_UNF_CIPHER_RSA_ENC_SCHEME_BLOCK_TYPE_2 UNF_CIPHER_RSA_ENC_SCHEME_BLOCK_TYPE_2
#define HI_UNF_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA1 UNF_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA1
#define HI_UNF_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA224 UNF_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA224
#define HI_UNF_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA256 UNF_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA256
#define HI_UNF_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA384 UNF_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA384
#define HI_UNF_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA512 UNF_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA512
#define HI_UNF_CIPHER_RSA_ENC_SCHEME_RSAES_PKCS1_V1_5 UNF_CIPHER_RSA_ENC_SCHEME_RSAES_PKCS1_V1_5
#define HI_UNF_CIPHER_RSA_ENC_SCHEME_BUTT UNF_CIPHER_RSA_ENC_SCHEME_BUTT
typedef UNF_CIPHER_RSA_ENC_SCHEME_E HI_UNF_CIPHER_RSA_ENC_SCHEME_E;
#define HI_UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA1 UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA1
#define HI_UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA224 UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA224
#define HI_UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA256 UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA256
#define HI_UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA384 UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA384
#define HI_UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA512 UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA512
#define HI_UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA1 UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA1
#define HI_UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA224 UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA224
#define HI_UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA256 UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA256
#define HI_UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA384 UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA384
#define HI_UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA512 UNF_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA512
#define HI_UNF_CIPHER_RSA_SIGN_SCHEME_BUTT UNF_CIPHER_RSA_SIGN_SCHEME_BUTT
typedef UNF_CIPHER_RSA_SIGN_SCHEME_E HI_UNF_CIPHER_RSA_SIGN_SCHEME_E;
typedef UNF_CIPHER_RSA_PUB_KEY_S HI_UNF_CIPHER_RSA_PUB_KEY_S;
typedef UNF_CIPHER_RSA_PRI_KEY_S HI_UNF_CIPHER_RSA_PRI_KEY_S;
typedef UNF_CIPHER_RSA_PUB_ENC_S HI_UNF_CIPHER_RSA_PUB_ENC_S;
typedef UNF_CIPHER_RSA_PRI_ENC_S HI_UNF_CIPHER_RSA_PRI_ENC_S;
typedef UNF_CIPHER_RSA_SIGN_S HI_UNF_CIPHER_RSA_SIGN_S;
typedef UNF_CIPHER_RSA_VERIFY_S HI_UNF_CIPHER_RSA_VERIFY_S;

#define HI_UNF_CIPHER_Open(HI_VOID) HI_UNF_CIPHER_Init(HI_VOID);
#define HI_UNF_CIPHER_Close(HI_VOID) HI_UNF_CIPHER_DeInit(HI_VOID);

HI_S32 HI_UNF_CIPHER_Init(HI_VOID);

HI_S32 HI_UNF_CIPHER_DeInit(HI_VOID);

HI_S32 HI_UNF_CIPHER_CreateHandle(HI_HANDLE* phCipher, const HI_UNF_CIPHER_ATTS_S *pstCipherAttr);

HI_S32 HI_UNF_CIPHER_DestroyHandle(HI_HANDLE hCipher);

HI_S32 HI_UNF_CIPHER_ConfigHandle(HI_HANDLE hCipher, const HI_UNF_CIPHER_CTRL_S* pstCtrl);

HI_S32 HI_UNF_CIPHER_ConfigHandleEx(HI_HANDLE hCipher, const HI_UNF_CIPHER_CTRL_EX_S* pstExCtrl);

HI_S32 HI_UNF_CIPHER_Encrypt(HI_HANDLE hCipher, HI_SIZE_T szSrcPhyAddr, HI_SIZE_T szDestPhyAddr, HI_U32 u32ByteLength);

HI_S32 HI_UNF_CIPHER_Decrypt(HI_HANDLE hCipher, HI_SIZE_T szSrcPhyAddr, HI_SIZE_T szDestPhyAddr, HI_U32 u32ByteLength);

HI_S32 HI_UNF_CIPHER_EncryptVir(HI_HANDLE hCipher, const HI_U8 *pu8SrcData, HI_U8 *pu8DestData, HI_U32 u32ByteLength);


HI_S32 HI_UNF_CIPHER_DecryptVir(HI_HANDLE hCipher, const HI_U8 *pu8SrcData, HI_U8 *pu8DestData, HI_U32 u32ByteLength);

HI_S32 HI_UNF_CIPHER_EncryptMulti(HI_HANDLE hCipher, const HI_UNF_CIPHER_DATA_S *pstDataPkg, HI_U32 u32DataPkgNum);

HI_S32 HI_UNF_CIPHER_GetHandleConfig(HI_HANDLE hCipher, HI_UNF_CIPHER_CTRL_S* pstCtrl);

HI_S32 HI_UNF_CIPHER_DecryptMulti(HI_HANDLE hCipher, const HI_UNF_CIPHER_DATA_S *pstDataPkg, HI_U32 u32DataPkgNum);

HI_S32 HI_UNF_CIPHER_GetTag(HI_HANDLE hCipher, HI_U8 *pu8Tag, HI_U32 *pu32TagLen);

HI_S32 HI_UNF_CIPHER_KladEncryptKey(HI_UNF_CIPHER_CA_TYPE_E enRootKey,
                                    HI_UNF_CIPHER_KLAD_TARGET_E enTarget,
                                    const HI_U8 *pu8CleanKey, HI_U8* pu8EcnryptKey, HI_U32 u32KeyLen);

HI_S32 HI_UNF_CIPHER_GetRandomNumber(HI_U32 *pu32RandomNumber);

HI_S32 HI_UNF_CIPHER_HashInit(const HI_UNF_CIPHER_HASH_ATTS_S *pstHashAttr, HI_HANDLE *pHashHandle);

HI_S32 HI_UNF_CIPHER_HashUpdate(HI_HANDLE hHashHandle, const HI_U8 *pu8InputData, HI_U32 u32InputDataLen);


HI_S32 HI_UNF_CIPHER_HashFinal(HI_HANDLE hHashHandle, HI_U8 *pu8OutputHash);


HI_S32 HI_UNF_CIPHER_RsaPublicEncrypt(const HI_UNF_CIPHER_RSA_PUB_ENC_S *pstRsaEnc,
                                  const HI_U8 *pu8Input, HI_U32 u32InLen,
                                  HI_U8 *pu8Output, HI_U32 *pu32OutLen);


HI_S32 HI_UNF_CIPHER_RsaPrivateDecrypt(const HI_UNF_CIPHER_RSA_PRI_ENC_S *pstRsaDec,
                                    const HI_U8 *pu8Input, HI_U32 u32InLen,
                                    HI_U8 *pu8Output, HI_U32 *pu32OutLen);


HI_S32 HI_UNF_CIPHER_RsaPrivateEncrypt(const HI_UNF_CIPHER_RSA_PRI_ENC_S *pstRsaEnc,
                                    const HI_U8 *pu8Input, HI_U32 u32InLen,
                                    HI_U8 *pu8Output, HI_U32 *pu32OutLen);


HI_S32 HI_UNF_CIPHER_RsaPublicDecrypt(const HI_UNF_CIPHER_RSA_PUB_ENC_S *pstRsaDec,
                               const HI_U8 *pu8Input, HI_U32 u32InLen,
                               HI_U8 *pu8Output, HI_U32 *pu32OutLen);


HI_S32 HI_UNF_CIPHER_RsaSign(const HI_UNF_CIPHER_RSA_SIGN_S *pstRsaSign,
                             const HI_U8 *pu8InData, HI_U32 u32InDataLen,
                             const HI_U8 *pu8HashData,
                             HI_U8 *pu8OutSign, HI_U32 *pu32OutSignLen);


HI_S32 HI_UNF_CIPHER_RsaVerify(const HI_UNF_CIPHER_RSA_VERIFY_S *pstRsaVerify,
                               const HI_U8 *pu8InData, HI_U32 u32InDataLen,
                               const HI_U8 *pu8HashData,
                               const HI_U8 *pu8InSign, HI_U32 u32InSignLen);


#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif /* __HI_UNF_CIPHER_H__ */
